package com.rd.sys.common.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateTimeUtils {
    /**
     * 日期格式
     */
    public static final SimpleDateFormat defaultDatetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static final SimpleDateFormat millisecondFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    public static final SimpleDateFormat defaultDateFormat = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * 获取当前日期(yyyy-MM-dd形式)
     *
     * @return
     */
    public static String getNowDate() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat dateFormat = defaultDateFormat;
        return dateFormat.format(cal.getTime());
    }

    /**
     * 获取当前日期(yyyy-MM-dd HH:mm:ss形式)
     *
     * @return
     */
    public static String getNowDatetime() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat dateFormat = defaultDatetimeFormat;
        return dateFormat.format(cal.getTime());
    }

    /**
     * 将时间转换为字符串
     *
     * @param date   时间字符串
     * @param format 格式化样式
     * @return
     */
    public static String getStringFromDate(Date date, SimpleDateFormat format) {
        return format.format(date);
    }

    /**
     * 将时间转换为字符串
     *
     * @param date   时间字符串
     * @param format 格式化样式
     * @return
     */
    public static String getStringFromDate(Date date, String format) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        return dateFormat.format(date);
    }

    /**
     * 将时间转换为字符串 (yyyy-MM-dd形式)
     *
     * @param date
     * @return
     */
    public static String getStringFromDate(Date date) {
        return getStringFromDate(date, defaultDateFormat);
    }

    /**
     * 将时间转换为字符串 (yyyy-MM-dd HH:mm:ss形式)
     *
     * @param datetime
     * @return
     */
    public static String getStringFromDatetime(Date datetime) {
        return getStringFromDate(datetime, defaultDatetimeFormat);
    }

    /**
     * 将字符串转换为时间
     *
     * @param strDate 时间字符串
     * @param format  格式化样式
     * @return
     */
    public static Date getDateFromString(String strDate, SimpleDateFormat format) {
        if (strDate == null) {
            return null;
        }
        try {
            SimpleDateFormat localDateFormat = format;
            Date date = localDateFormat.parse(strDate);
            return date;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 将字符串转换为时间(yyyy-MM-dd形式)
     *
     * @param strDate 时间字符串
     * @return
     */
    public static Date getDateFromString(String strDate) {
        return getDateFromString(strDate, defaultDateFormat);
    }

    /**
     * 将字符串转换为时间(yyyy-MM-dd HH:mm:ss形式)
     *
     * @param strDatetime 时间字符串
     * @return
     */
    public static Date getDatetimeFromString(String strDatetime) {
        return getDateFromString(strDatetime, defaultDatetimeFormat);
    }

    /**
     * 将字符串时间格式化(yyyy-MM-dd HH:mm:ss形式)
     *
     * @param strDatetime 字符串时间
     * @return
     */
    public static String formatDatetime(String strDatetime) {
        Date date = getDatetimeFromString(strDatetime);
        return getStringFromDatetime(date);
    }

    /**
     * 将字符串时间格式化(yyyy-MM-dd形式)
     *
     * @param strDatetime 字符串时间
     * @return
     */
    public static String formatDate(String strDate) {
        Date date = getDateFromString(strDate);
        return getStringFromDate(date);
    }

    /**
     * 将字符串时间格式化(yyyy-MM-dd HH:mm:ss形式)
     *
     * @param longDatetime long型的时间
     * @return
     */
    public static String formatDatetimeOfLong(String longDatetime) {
        return formatDatetimeOfLong(longDatetime, defaultDateFormat);
    }

    /**
     * 将字符串时间格式化(yyyy-MM-dd HH:mm:ss形式)
     *
     * @param longDatetime long型的时间
     * @return
     */
    public static String formatDatetimeOfLong(String longDatetime, SimpleDateFormat format) {
        while (longDatetime.length() < 13) {
            longDatetime += "0"; // long型的时间戳,13位长是标准,即精确到毫秒
        }
        Date date = new Date(Long.valueOf(longDatetime));
        return getStringFromDate(date, format);
    }


    /**
     * 获取当前时间多少个小时之后的时间
     *
     * @param hour 多少个小时之后
     * @return
     */
    public static java.util.Date getNowDatePlusHOUR(int hour) {
        java.util.Calendar c = java.util.Calendar.getInstance();
        c.add(Calendar.HOUR, hour);
        return c.getTime();
    }

}
